查看原文
其他

X86 寄存器及寻址方式

无知少年 非典型技术宅 2024-01-03

X86 寄存器及寻址方式

絮絮叨叨:之前看的汇编都是 ARM Cotex M 系列,在调试任务切换时,不得不学习一下 x86 的汇编。

x86 寄存器列表

inter i386 平台下寄存器包括 8 个 32 位的通用寄存器、8 个调试寄存器、6 个 16 位的段寄存器、4 个 32 位的控制寄存器等寄存器。

使用最多的时 8 个通用寄存器,EAX、ECX、EDX、EBX、ESI、EDI、ESP、EBP 和一个程序指针寄存器 EIP。

8 个通用寄存器可以作为 16 位(字)或者 32 位(双字)进行访问,同时可以独立访问前四个寄存器(EAX、ECX、EDX、EBX)的低两字节。

x86 通用寄存器

x86 寄存器功能

x86 寄存器功能列表如下:

寄存器功能函数调用时保护者
eax累加器作为返回值调用者保护
ebx基地址寄存器临时参数被调用者保护
ecx计数器第 4 个参数调用者保护
edx中间数据寄存器第 3 个参数调用者保护
esi源变址寄存器第 2 个参数被调用者保护
edi目标变址寄存器第 1 个参数被调用者保护
ebp栈底指针-被调用者保存
esp栈顶指针--

注:在 main 函数中调用函数 add ,main 为调用者,add 为被调用者。

在 main 函数调用 add 之前,应该将【EAX, ECX, EDX】保存到栈中。

在 add 函数中应该将【EBX, ESI, EDI, EBP】保存到栈中,在函数执行完成后,恢复原始数据。

操作数类型

在 x86 指令中,包括三类操作数:立即数、寄存器和存储器引用。

立即数:即常数,任何可以用 32 位寄存器表示的数,都可以作为立即数。

立即数使用前缀$进行表示,后面可跟十进制或者十六进制。使用 代表任意立即数。
例如:$0x10 或者 $16 ,都表示数字 16。

寄存器:用符号 表示任意寄存器 a , 使用 表示寄存器 a 的值。

存储器引用:存储器引用表示存储器某个地址的数据。
表示地址 Addr 的值。

寻址方式

x86 包括 7 种寻址方式,分别为:立即数寻址寄存器寻址绝对寻址间接寻址基址+偏移寻址变址寻址比例变址寻址

前三种寻址方式的表示即上面立即数的表示方式。

间接寻址:通过访问寄存器 的值(),访问对应地址的值。
使用符号 表示。

例如:EAX 寄存器为 0x0001 ,地址 0x0001 的值为0x1234。则 的值为0x1234

基址+偏移寻址:通过寄存器 和立即数 ,访问地址: 处的值。使用符号 表示。

完整的寄存器寻址方式见下图


参考资料

[1]

i386的寄存器: https://www.cnblogs.com/wang-can/p/3369184.html

[2]

《深入理解计算机系统》: 3.4访问信息

[3]

x86-64通用寄存器: https://www.cnblogs.com/sgawscd/p/11210026.html




end



爱技术,爱生活

这里是非典型技术宅,点击上方蓝字关注


欢迎点击 在看👀,点赞👍,收藏⭐

微信公众号|非典型技术宅


往期推荐
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存